﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SiChuan.FormsApp.AppCode.Extensions;
using SiChuan.FormsApp.AppCode.Exceptions;

namespace SiChuan.FormsApp.AppCode.Helpers {

    public static class HisHelper {

        static string _url = "http://10.92.0.95:8090/ReportService.svc?wsdl";

        /* 内江市妇幼保健院  */
        static string _token = "22ba9c7498a14ee2a4c82d81b461e3de";
        static string _uName = "scyy1719";
        static string _cName = "内江市妇幼保健院";

        ///*  大邑县第二人民医院  */
        //static string _token = "ae0a9ac1c2c94e49936233e234e456f8";
        //static string _uName = "scyy281";
        //static string _cName = "大邑县第二人民医院";

        static string _resStatus_reg = "<操作状态>[^<]?</操作状态>";
        static string _resStatus_des = "<状态描述>[^<]?</状态描述>";

        static string req_body = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:sin=\"http://sinosoft.iig.com/\"><soapenv:Header/><soapenv:Body><sin:WEBRequest><arg0>{body}</arg0></sin:WEBRequest></soapenv:Body></soapenv:Envelope>";

        public static async Task<string> GoResponseAsync(this string url,string body) {
            string req_str = "";
            if (body.LastIndexOf("<?xml version=\"1.0\" encoding=\"utf-8\"?>") < 0) {
                req_str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + body;
            } else {
                req_str = body;
            }
            req_str = req_str.StringToBase64();
            req_str = req_body.Replace("{body}", req_str);

            var res = await url.PostSopa(req_str);
            if (!res.Item1) {
                NlogHelper.Warn("请求错误！");
            }
            if (res.Item2.IsNullOrWhiteSpace()) {
                NlogHelper.Warn("请求错误！");
                return null;
            }

            var res_str = res.Item2
                .Replace("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">","")
                .Replace("<soap:Body>", "")
                .Replace("<ns2:WEBRequestResponse xmlns:ns2=\"http://sinosoft.iig.com/\">", "")
                .Replace("<return>", "")
                .Replace("</return>", "")
                .Replace("</ns2:WEBRequestResponse>", "")
                .Replace("</soap:Body>", "")
                .Replace("</soap:Envelope>", "")
                .Replace(" ", "")
                .Replace("\r", "")
                .Replace("\n", "");

            return res_str.Base64ToString();
        }

        public static async Task<string> GoResponseAsync(string body) {
            string req_str = "";
            if (body.LastIndexOf("<?xml version=\"1.0\" encoding=\"utf-8\"?>") < 0) {
                req_str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + body;
            } else {
                req_str = body;
            }
            req_str = req_str.StringToBase64();
            req_str = req_body.Replace("{body}", req_str);

            var res = await _url.PostSopa(req_str);
            if (!res.Item1) {
                NlogHelper.Warn("请求错误！");
            }
            if (res.Item2.IsNullOrWhiteSpace()) {
                NlogHelper.Warn("请求错误！");
                return null;
            }

            var res_str = res.Item2
                .Replace("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">", "")
                .Replace("<soap:Body>", "")
                .Replace("<ns2:WEBRequestResponse xmlns:ns2=\"http://sinosoft.iig.com/\">", "")
                .Replace("<return>", "")
                .Replace("</return>", "")
                .Replace("</ns2:WEBRequestResponse>", "")
                .Replace("</soap:Body>", "")
                .Replace("</soap:Envelope>", "")
                .Replace(" ", "")
                .Replace("\r", "")
                .Replace("\n", "");

            return res_str.Base64ToString();
        }

        public static string ReplaceString(string template) {
            return template.Replace("{token}", _token)
                        .Replace("{uName}", _uName)
                        .Replace("{cName}", _cName);
        }

        public static async Task<string> HisDelAsync(this string sid) {
            string body_str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<接口><令牌>{token}</令牌>\r\n  <数据类型>3</数据类型>\r\n  <操作类型>3</操作类型>\r\n  <操作单位>{cName}</操作单位>\r\n  <操作用户>{uName}</操作用户>\r\n  <病例>{sid}</病例>\r\n</接口>\r\n";
            body_str = ReplaceString(body_str);
            return await _url.GoResponseAsync(body_str.Replace("{sid}", sid));
        }


        public static async Task<string> HisAddCaseAsync(this string guid, string content) {
            if (content.IsNullOrWhiteSpace()) throw new WarnException("病例内容不能为空");
            string body_str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<接口>\r\n  <令牌>{token}</令牌>\r\n  <数据类型>7</数据类型>\r\n  <操作类型>1</操作类型>\r\n  <操作单位>{cName}</操作单位>\r\n  <操作用户>{uName}</操作用户>\r\n  <病例 Guid=\"{guid}\">{content}</病例>\r\n</接口>\r\n";
            body_str = ReplaceString(body_str);
            return await _url.GoResponseAsync(body_str.Replace("{guid}", guid).Replace("{content}",content));
        }
        /// <summary>
        /// 上报病例
        /// </summary>
        /// <param name="caseid"></param>
        /// <returns></returns>
        /// <exception cref="WarnException"></exception>
        public static async Task<string> HisUpdateCaseAsync(this string caseid) {
            if (caseid.IsNullOrWhiteSpace()) throw new WarnException("病例ID不能为空");
            string body_str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<接口>\r\n  <令牌>{token}</令牌>\r\n  <数据类型>3</数据类型>\r\n  <操作类型>4</操作类型>\r\n  <操作单位>{cName}</操作单位>\r\n  <操作用户>{uName}</操作用户>\r\n  <病例>{caseid}</病例>\r\n</接口>\r\n";
            body_str = ReplaceString(body_str);
            return await _url.GoResponseAsync(body_str.Replace("{caseid}", caseid));
        }
    }
}
